gm8fandomcom_pl-20200214-history
Planowanie ruchu
Planowanie ruchu ułatwia przemieszczanie pewnych instancji z danego miejsca do innego unikając kolizji z innymi instancjami (np. ścianami). Planowanie ruchu nie jest łatwe. Niemożliwe jest stworzenie ogólnej funkcji, która zadziała w każdej sytuacji. Wyliczanie ruchu wolnego od kolizji jest czasochłonną operacją. Musisz więc uważać kiedy to stosujesz. Please keep these remarks in mind when you use any of the following functions. W Game Makerze możliwe są różne sposoby planowania ruchu. The simplest form lets an instance take a step towards a particular goal position, trying to go straight if possible but taking a different direction if required. Funkcje te powinny być używane w zdarzeniu step instancji. They correspond to the motion planning actions that are also available: *'mp_linear_step(x,y,stepsize,checkall)' Ta funkcja pozwala instancji postawić krok prosto w kierunku pozycji (x,y). Wielkość kroku jest określana przez stepsize. Gdy instancja znajdzie się na danej pozycji nie zostanie przesunięta dalej. Jeśli checkall jest prawdziwe (true) instancja zostanie zatrzymana gdy uderzy w dowolną inną instancję. Gdy argument ten jest fałszywy (false) instancja będzie zatrzymywana tylko na obiektach z parametrem solid. Zauważ, że funkcja ta nie próbuje obejść napotkanej przeszkody. Zostaje po prostu zaniedbana. Funkcja zwraca czy docelowa pozycja została osiągnięta. *'mp_linear_step_object(x,y,stepsize,obj)' Funkcja działa jak powyższa, jednak jedynie instancje typu obj są uznawana za przeszkody. obj może być obiektem lub id instancji. *'mp_potential_step(x,y,stepsize,checkall)' Podobnie jak poprzednia, ta funkcja pozwala instancji wykonać krok w kierunku określonej pozycji. Jednak podejmuje ona próby unikania przeszkód. Gdyby instancja miała wejść na obiekt solidny (lub dowolny inny gdy checkall jest prawdziwe) funkcja zmienia kierunek ruchu aby spróbować obejść przeszkodę dookoła. Nie jest to gwarancją powodzenia, ale w większości łatwych przypadków funkcja skutecznie przesunie do celu. Funkcja zwraca czy docelowa pozycja została osiągnięta. *'mp_potential_step_object(x,y,stepsize,obj)' Funkcja działa jak powyższa, jednak jedynie instancje typu obj są uznawana za przeszkody. obj może być obiektem lub id instancji. *'mp_potential_settings(maxrot,rotstep,ahead,onspot)' Poprzednia funkcja do działania używa wielu parametrów, które mogą być zmienione przy użyciu tj funkcji. Ogólnie metoda pracy jest następująca. Najpierw podejmowana jest próba przesunięcia instancji prosto do celu. Sprawdzana jest pewna ilość kroków w przód, którą można ustawić za pomocą parametru ahead (domyślnie 3). Zmniejszenie tej wartości oznacza, że instancja rozpocznie zmianę kierunku ruchu później. Zwiększenie spowoduje, że zmiana kierunku rozpocznie się wcześniej. If this check leads to a collision it starts looking at directions more to the left and to the right of the best direction. It does this in steps of size rotstep (default 10). Reducing this gives the instance more movement possibilities but will be slower. Parametr maxrot jest trudniejszy do wyjaśnienia. Instancja posiada aktualny kierunek. maxrot (domyślnie 30) wskazuje o jak dużą wartość można zmienić kierunek w jednym kroku. Więc nawet jeśli możliwy jest bezpośredni ruch do pozycji do celowej stanie się to tylko jeśli nie zostanie naruszona maksymalna zmiana kierunku. If you make maxrot large the instance can change a lot in each step. Ułatwi to znalezienie krótszej ścieżki, ale będzie ona brzydsza. Jeśli ustawisz tę wartość niską ścieżka będzie zaokrąglona, ale może być bardziej okrężna (a czasami nawet nie znajdywać celu). Gdy krok nie może zostać wykonany zachowanie zależy od wartości onspot. If onspot is true (the default value), the instance will rotate on its spot by the amount indicated with maxrot. If it is false it will not move at all. Ustawienie tej wartości na fałsz (false) jest użyteczne np. dla samochodów, ale zmniejsza szanse na znalezienie ścieżki. NIEDOKOŃCZONE!!! Chcesz możesz dokończyć. Męczący artykuł :P